package com.cictec.middleware.tde.rm.protocol.rm.utils;

import java.nio.ByteBuffer;
import java.util.Date;

import com.cictec.middleware.commons.utils.BinaryUtils;

/**
 * 锐明 特殊类型协议转换
 * 
 * @author Administrator
 *
 */
public class RmBinaryUtils extends BinaryUtils {

	/**
	 * 四字节转经纬度，针对锐明设备。 第一个字节度，第二个字节分，第三个字节分的前两个小数位，第四个字节分的后两个小数位。
	 * 
	 * @param bytes
	 * @return
	 */
	public static double dwordToLatLngRM(byte[] bytes) {
		int latLng = unsignedByteToInt(bytes[0]);
		int latLngMinute = unsignedByteToInt(bytes[1]);
		int latLngMinuteFract = wordToInt(bytes, 2);
		StringBuffer latLngMinuteFractStr = new StringBuffer(String.valueOf(latLngMinuteFract));
		while (latLngMinuteFractStr.length() < 4) {
			latLngMinuteFractStr.insert(0, '0');
		}
		return latLng + Double.parseDouble(String.valueOf(latLngMinute) + "." + latLngMinuteFractStr) / 60;
	}

	public static double dwordToLatLngRM(ByteBuffer in) {
		byte[] bytes = new byte[4];
		in.get(bytes);
		return dwordToLatLngRM(bytes);
	}

	/**
	 * 透传数据获取
	 * @param in
	 * @param length
	 * @return
	 */
	public static byte[] dataToBusDataRM(ByteBuffer in, int length) {
		byte[] bytes = new byte[length];
		in.get(bytes);
		return bytes;

	}

	/**
	 * 设置锐明经纬度字节流拼装
	 * 
	 * @param out
	 * @param latOrlngFormaterString
	 */
	public static void setLatOrLngByteDataRM(ByteBuffer out, String latOrlngFormaterString) {
		String[] orglngArray = latOrlngFormaterString.split(",");
		String ddlng = orglngArray[0];
		String mmlng = orglngArray[1];
		int lngidx = mmlng.lastIndexOf(".");

		int lngdd = Integer.valueOf(ddlng);
		int lngmm = Integer.valueOf(mmlng.substring(0, lngidx));
		// int lngmm12 = Integer.valueOf(lngformat.substring(lngidx+1,
		// lngidx+3));
		// int lngmm34 = Integer.valueOf(lngformat.substring(lngidx+3,
		// lngidx+5));
		int lngmm1234 = Integer.valueOf(mmlng.substring(lngidx + 1, lngidx + 5));

		out.put(BinaryUtils.intToUnsignedByte(lngdd)); // 第一字节为度
		out.put(BinaryUtils.intToUnsignedByte(lngmm)); // 第二字节为分
		// out.put(BinaryUtils.intToUnsignedByte(lngmm12)); // 第三字节为分小数点后第 1、2
		// 位绝对数值的 16 进制数
		// out.put(BinaryUtils.intToUnsignedByte(lngmm34)); // 第四字节为分小数点后第 3、4
		// 位绝对数值的 16 进制数
		out.put(BinaryUtils.intToWord(lngmm1234)); // 第三字节为分小数点后第 1、2 位绝对数值的 16 进制数
	}

	
	/**
	 * 锐明4字节数组转时间
	 * 
	 * @param bytes
	 * @return
	 */
	public static Date dwordToDateRM(byte[] bytes) {
		long m = bytes[0] & 0xFF;
		// "|="按位或赋值。
		m = m << 8 | (bytes[1] & 0xFF);
		m = m << 8 | (bytes[2] & 0xFF);
		m = m << 8 | (bytes[3] & 0xFF);

		return new Date(m * 1000);
	}

	/**
	 * 锐明4字节数组转时间
	 * @param in
	 * @return
	 */
	public static Date dwordToDateRM(ByteBuffer in) {
		byte[] bytes = new byte[4];
		in.get(bytes);
		return dwordToDateRM(bytes);
	}

	/**
	 * 锐明  时间转4字节数组
	 * @param date
	 * @return
	 */
	public static byte[] dateToDwordRM(Date date) {

		long m = date.getTime() / 1000;
		byte[] bytes = new byte[4];

		bytes[3] = intToUnsignedByte((int) (0xff & m));
		bytes[2] = intToUnsignedByte((int) ((0xff00 & m) >> 8));
		bytes[1] = intToUnsignedByte((int) ((0xff0000 & m) >> 16));
		bytes[0] = intToUnsignedByte((int) ((0xff000000 & m) >> 24));

		return bytes;
	}

	/**
	 * 锐明  时间转4字节数组
	 * @param date
	 * @param in
	 */
	public static void dateToDwordRM(Date date, ByteBuffer in) {
		in.put(dateToDwordRM(date));
	}
	
	
	public static String dwordToICNumber(ByteBuffer in){
		
		long number = in.get() & 0xFF;
		
		number = ((long)( in.get() & 0xFF ) << 8 ) | number;
		number = ((long)( in.get() & 0xFF ) << 16) | number;
		number = ((long)( in.get() & 0xFF ) << 24) | number;

		StringBuffer sb = new StringBuffer(String.valueOf(number));
		
		while(sb.length()<10){
			sb.insert(0, '0');
		}
		
		return sb.toString();
	}
	
	/**
	 * 锐明协议，【江门】需要十六进制物理卡号
	 * 
	 * @param in
	 * @return
	 */
	public static String hexStrToICNumberDoy(ByteBuffer in) {
		byte[] bytes = new byte[4];
		in.get(bytes);
		return byte2HexStr(bytes, 4, false);
	}
	
	/***************
	 * 东营卡号六位
	 * 
	 * @param in
	 * @return
	 */
	public static String dwordToICNumberDoy(ByteBuffer in) {

		long number = in.get() & 0xFF;

		number = ((long) (in.get() & 0xFF) << 8) | number;
		number = ((long) (in.get() & 0xFF) << 16) | number;
		number = ((long) (in.get() & 0xFF) << 24) | number;

		StringBuffer sb = new StringBuffer(String.valueOf(number));

		while (sb.length() < 6) {
			sb.insert(0, '0');
		}

		return sb.toString();
	}
}
